<!--
  - 基于迭代回归的基线校正 Iterative Regression Baseline Correction, IRBC
  - 库：ml-baseline-correction-regression
  - https://doi.org/10.1016/j.chemolab.2005.08.009
  - 步骤：
  -   1. 令Y等于baseline[]
  -   2. 令Y等于oldFitting[]，然后用n阶函数拟合
  -   3. 把X和baseline[]带入拟合函数得到一组拟合值fitting[]
  -   4. 如果fitting[i]小于baseline[i]，则用fitting[i]替换baseline[i]
  -   5. 计算oldFitting[]和fitting[]每个值的相对变化和(新 - 旧) / 旧，取绝对值
  -   6. 如果相对变化和小于某个阈值，则停止迭代
  -     否则浅拷贝fitting[]数组内容给oldFitting[]，然后回到第3步
  - 所以本质上是一个拟合，把基线从初始数据那里往下压，然后用拟合线的变化率来求是否收敛的方法
 -->
 
<!-- 视图层 --><!-- 页头(上) -->
<template><header-comp />

<!-- TFjs初始化组件 -->
<tfjsInit />

<!-- 读取数据 -->
<uni-card title="读取数据">
  <!-- 通告栏 -->
  <uni-notice-bar text=
    "打开含有波谱数据集的Excel文件。"
  />

  <!-- 训练按钮容器及按钮 -->
  <view class="center"><button
    :disabled="!tfBackendRef"
    @click="testMain()"
    size="mini" type="primary"
  >
    运行代码
  </button></view>

  <!-- 打开图表板容器及按钮 -->
  <view class="center"><button
    @click="showVisor()"
    size="mini" type="primary"
  >
    打开图表板
  </button></view>

</uni-card>

<!-- 页脚(下) -->
<footer-comp /></template>

<!-- 逻辑层 -->
<script setup>
// 导入vue的onMounted、ref方法
// import { shallowRef, ref } from "vue"
// 导入tfjs-visor库
import * as tf from "@tensorflow/tfjs"
import * as tfvis from "@tensorflow/tfjs-vis"
// 导入TF初始化组件
import tfjsInit from "../index/tfjs-init.vue"
// 导入xlsx库
// import * as XLSX from "xlsx"

import { baselineCorrectionRegression } from "ml-baseline-correction-regression"
// 导入公共方法库的方法
import { tfBackendRef, showVisor, aoaTotfvisChart, minToZero, maxToOne } from "../../scripts/app_common.js"
// 导入测试数据集
import { testData } from "../../datasets/test-data.js"


/**
 * @ref对象
 */


/**
 * @其他对象
 */

// 主方法
function testMain() {

  // 记个时
  console.time("irbc处理耗时")
  console.log("开始对数据进行irbc处理...")

  // 先处理一下
  minToZero(testData.y, true)
  maxToOne(testData.y)

  // 数据先做个图
  aoaTotfvisChart(
    // 图表类型
    "linechart",
    // 图表容器
    { tab: "数据", name: "原始谱图" },
    // 图表数据：第一个数据
    [testData],
    // 数据序列标签
    ["数据"]
  )
  polyIterReg
  /**
   * @irbc处理
   */
  const { corrected, delta, iteration, baseline, regression } = baselineCorrectionRegression(
    testData.x,
    testData.y,
    {
      // 最大迭代次数
      maxIterations: 10000,
      // 函数阶数
      regressionOptions: 5
    }
  )

  // 输出耗时
  console.timeEnd("irbc处理耗时")

  // 打印结果
  // 偏差
  console.log("delta: ", delta)
  // 迭代次数
  console.log("iteration: ", iteration)
  // 回归方程
  console.log("regression: ", regression)

  // 作图：校正
  const correctedData = {
    x: testData.x,
    y: corrected,
  }
  aoaTotfvisChart(
    // 图表类型
    "linechart",
    // 图表容器
    { tab: "数据", name: "校正" },
    // 图表数据：第一个数据
    [correctedData],
    // 数据序列标签
    ["校正"]
  )
  
  // 作图：基线
  const baselineData = {
    x: testData.x,
    y: baseline,
  }
  aoaTotfvisChart(
    // 图表类型
    "linechart",
    // 图表容器
    { tab: "数据", name: "基线" },
    // 图表数据：第一个数据
    [baselineData],
    // 数据序列标签
    ["基线"]
  )

}


</script>
